Tanz der Sprites

← Zurück zum Forum

.... und damit es übersichtlicher wird, beginne ich von ganz vorne und nenne es Tanz der Sprites!

Das kleine Programm wird dann folgendes erzeugen:

TdS.MOV

Gruß

Peter

Anhänge:
AntwortZitat

... und hier schon mal der komplette Code vorab:

      org 4096


dlist .by 117,117,117
    .by 93,210,155
    .by 93,0,156    
    .by 93,80,156
    .by 93,160,156

    .by 93,0,157
    .by 93,80,157
    .by 221,160,157

    .by 93,0,158
    .by 93,80,158
    .by 93,160,158  

    .by 93,0,159
    .by 93,80,159
    .by 93,160,159  

    .by 93,0,160    
    .by 93,80,160
    .by 93,160,160

    .by 93,0,161
    .by 93,80,161
    .by 221,160,161

    .by 93,0,162
    .by 93,80,162
    .by 93,160,162

    .by 93,0,163
    .by 93,80,163
    .by 93,160,163

    .by 93,0,164    
    .by 93,80,164
    .by 93,160,164

    .by 93,0,165
    .by 93,80,165
    .by 93,160,165

    .by 93,0,166
    .by 93,80,166
    .by 93,160,166  

    .by 93,0,167
    .by 93,80,167
    .by 93,160,167

    .by 93,0,168  
    .by 93,80,168
    .by 93,160,168

    .by 93,0,169
    .by 93,80,169
    .by 93,160,169

    .by 93,0,170
    .by 93,80,170
    .by 93,160,170

    .by 93,0,171
    .by 93,80,171
    .by 93,160,171

    .by 93,0,172
    .by 93,80,172
    .by 93,160,172

    .by 93,0,173
    .by 93,80,173
    .by 93,160,173

    .by 93,0,174
    .by 93,80,174
    .by 93,160,174

    .by 93,0,175
    .by 93,80,175
    .by 93,160,175

    .by 93,0,176  
    .by 93,80,176
    .by 93,160,176

    .by 93,0,177
    .by 93,80,177
    .by 93,160,177

    .by 93,0,178
    .by 93,80,178
    .by 93,160,178

    .by 93,0,179
    .by 93,80,179
    .by 93,160,179

    .by 93,0,180  
    .by 93,80,180
    .by 93,160,180

    .by 93,0,181
    .by 93,80,181
    .by 93,160,181

    .by 93,0,182
    .by 93,80,182
    .by 93,160,182

    .by 93,0,183
    .by 93,80,183
    .by 93,160,183

    .by 93,0,184
    .by 93,80,184
    .by 93,160,184

    .by 93,0,185
    .by 93,80,185
    .by 93,160,185

    .by 93,0,186
    .by 93,80,186
    .by 93,160,186

    .by 93,0,187
    .by 93,80,187
    .by 221,160,187
    .by 65
    .wo dlist


display = 228
display99 = 230
          ;------ Speicher und Variablen für Player allgemein ----------
display1 = 232
display2 = 234
display3 = 236
display199 = 238
display299 = 240
display399 = 242
tmp1 = 1000   
tmp2 = 1001
tmp3 = 1002
tmp4 = 1003
tmp5 = 1004
tmp6 = 1005
tmp7 = 1006
tmp8 = 1007
tmp9 = 1008
displayzw = 1009
ystore = 1011
xstore = 1012
beweg = 1013
        ;------ Variablen für die Warteschleifen -----------------------
delay = 1020
schleife1 = 1021
schleife2 = 1022
        ;------ Variablen für Player1 ----------------------------------
zaehler1 = 1100
display11 = 1102
display21 = 1104
display31 = 1106
tmp11 = 1108    
tmp21 = 1109
tmp31 = 1110
tmp41 = 1111
tmp51 = 1112
tmp61 = 1113
tmp71 = 1114
tmp81 = 1115
tmp91 = 1116
displayzw1 = 1117
ystore1 = 1118
xstore1 = 1119

        ;------ Variablen für Player2 ----------------------------------

zaehler2 = 1120
display12 = 1122
display22 = 1124
display32 = 1126
tmp12 = 1128    
tmp22 = 1129
tmp32 = 1130
tmp42 = 1131
tmp52 = 1132
tmp62 = 1133
tmp72 = 1134
tmp82 = 1135
tmp92 = 1136
displayzw2 = 1137
ystore2 = 1138
xstore2 = 1139
        ;------ Variablen für Player3 ----------------------------------

zaehler3 = 1140
display13 = 1142
display23 = 1144
display33 = 1146
tmp13 = 1148    
tmp23 = 1149
tmp33 = 1150
tmp43 = 1151
tmp53 = 1152
tmp63 = 1153
tmp73 = 1154
tmp83 = 1155
tmp93 = 1156
displayzw3 = 1157
ystore3 = 1158
xstore3 = 1159
        ;---------------------------------------------------------------

player11  .by 170,170,0
      .by 42,170,128
      .by 10,170,160
      .by 2,170,168
player12  .by 85,85,0
      .by 21,85,64
      .by 5,85,80
      .by 1,85,84
player13  .by 170,170,0
      .by 42,170,128
      .by 10,170,160
      .by 2,170,168     
maske11   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3
maske12   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3
maske13   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3

bewegung1 .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2 .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3   
bewegung3 .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5   

      .proc main
      mwa #39936 display    ;--- hier fängt die Bildschirmadresse an 0,156 = 256x156
      mwa #30720 display99
      mwa #dlist 560  
      ldx #0          ;Bildschirm füllen
      ldy #0
@     lda #11
      sta tmp1
      #if .byte tmp1>#40
      ;jmp @-
      #end
      sta (display),y
      sta (display99),y
      iny
      bne @-
      inc display+1
      inc display99+1
      clc
      inx
      cpx #31
      bne @-
      ;-------------------- Variablen Player1 init ---------      
      mva #0 display11
      mva #80 display21
      mva #160 display31
      lda #170
      sta display11+1
      sta display21+1
      sta display31+1
      mva #0 zaehler1
      ldy #34
      sty ystore1
      ;-------------------- Variablen Player2 init ---------      
      mva #0 display12
      mva #80 display22
      mva #160 display32
      lda #173
      sta display12+1
      sta display22+1
      sta display32+1
      mva #0 zaehler2
      ldy #44
      sty ystore2
      ;-------------------- Variablen Player3 init ---------      
      mva #0 display13
      mva #80 display23
      mva #160 display33
      lda #165
      sta display13+1
      sta display23+1
      sta display33+1
      mva #0 zaehler3
      ldy #44
      sty ystore3

;--------------------------Hauptprogramm----------------------------
loop    
      jsr player1
      jsr player2
      jsr player3
      mva #4 delay
      jsr warte2
      jmp loop    
      .endp
;--------------------------Subroutinen------------------------------

        .proc warte2
        mva #0 schleife1
        mva #0 schleife2
@     inc schleife1
      #if .byte schleife1<#255
      jmp @-
      #end
      mva #0 schleife1
      inc schleife2
      #if .byte schleife2<delay
      jmp @-
      #end
      rts
      .endp
        .proc player1
        mwa display11 display1
      mwa display21 display2
      mwa display31 display3
      mva tmp11 tmp1
      mva tmp21 tmp2
      mva tmp31 tmp3
      mva tmp41 tmp4
      mva tmp51 tmp5
      mva tmp61 tmp6
      mva tmp71 tmp7
      mva tmp81 tmp8
      mva tmp91 tmp9
      mva displayzw1 displayzw
      mva ystore1 ystore
      mva xstore1 xstore
        ldx zaehler1
      lda bewegung1,x
      sta beweg
      jsr player.bewegung
      inc zaehler1
      #if .byte zaehler1=#79    
      mva #0 zaehler1
      #end
      mwa display1 display11 
      mwa display2 display21 
      mwa display3 display31 
      mva tmp1 tmp11
      mva tmp2 tmp21
      mva tmp3 tmp31
      mva tmp4 tmp41
      mva tmp5 tmp51
      mva tmp6 tmp61
      mva tmp7 tmp71
      mva tmp8 tmp81
      mva tmp9 tmp91
      mva displayzw displayzw1
      mva ystore ystore1
      mva xstore xstore1
      #if .byte ystore1<=#0
      jsr player.restore
        mva #0 display11
      mva #80 display21
      mva #160 display31
      lda #170
      sta display11+1
      sta display21+1
      sta display31+1
      mva #0 zaehler1
      ldy #34
      sty ystore1
        #end
      rts
      .endp
      .proc player2
        mwa display12 display1
      mwa display22 display2
      mwa display32 display3
      mva tmp12 tmp1
      mva tmp22 tmp2
      mva tmp32 tmp3
      mva tmp42 tmp4
      mva tmp52 tmp5
      mva tmp62 tmp6
      mva tmp72 tmp7
      mva tmp82 tmp8
      mva tmp92 tmp9
      mva displayzw2 displayzw
      mva ystore2 ystore
      mva xstore2 xstore
        ldx zaehler2
      lda bewegung3,x
      sta beweg
      jsr player.bewegung
      inc zaehler2
      #if .byte zaehler2=#79    
      mva #0 zaehler2
      #end
      mwa display1 display12
      mwa display2 display22 
      mwa display3 display32 
      mva tmp1 tmp12
      mva tmp2 tmp22
      mva tmp3 tmp32
      mva tmp4 tmp42
      mva tmp5 tmp52
      mva tmp6 tmp62
      mva tmp7 tmp72
      mva tmp8 tmp82
      mva tmp9 tmp92
      mva displayzw displayzw2
      mva ystore ystore2
      mva xstore xstore2
      #if .byte ystore2<=#0
      jsr player.restore
        mva #0 display12
      mva #80 display22
      mva #160 display32
      lda #173
      sta display12+1
      sta display22+1
      sta display32+1
      mva #0 zaehler2
      ldy #44
      sty ystore2
        #end
      rts
      .endp
      .proc player3
        mwa display13 display1
      mwa display23 display2
      mwa display33 display3
      mva tmp13 tmp1
      mva tmp23 tmp2
      mva tmp33 tmp3
      mva tmp43 tmp4
      mva tmp53 tmp5
      mva tmp63 tmp6
      mva tmp73 tmp7
      mva tmp83 tmp8
      mva tmp93 tmp9
      mva displayzw3 displayzw
      mva ystore3 ystore
      mva xstore3 xstore
        ldx zaehler3
      lda bewegung2,x
      sta beweg
      jsr player.bewegung
      inc zaehler3
      #if .byte zaehler3=#79    
      mva #0 zaehler3
      #end
      mwa display1 display13
      mwa display2 display23 
      mwa display3 display33 
      mva tmp1 tmp13
      mva tmp2 tmp23
      mva tmp3 tmp33
      mva tmp4 tmp43
      mva tmp5 tmp53
      mva tmp6 tmp63
      mva tmp7 tmp73
      mva tmp8 tmp83
      mva tmp9 tmp93
      mva displayzw displayzw3
      mva ystore ystore3
      mva xstore xstore3
      #if .byte ystore3<=#0
      jsr player.restore
        mva #0 display13
      mva #80 display23
      mva #160 display33
      lda #165
      sta display13+1
      sta display23+1
      sta display33+1
      mva #0 zaehler3
      ldy #44
      sty ystore3
        #end
      rts
      .endp
      .proc player
bewegung  #if .byte beweg=#7
      jsr player.nachlinks
      #end
      #if .byte beweg=#3
      jsr player.nachrechts
      #end
      #if .byte beweg=#5
      jsr player.nachunten
      #end
      #if .byte beweg=#1
      jsr player.nachoben
      #end
      #if .byte beweg=#2
      jsr player.nachoben
      jsr player.nachrechts
      #end
      #if .byte beweg=#4
      jsr player.nachunten
      jsr player.nachrechts
      #end
      #if .byte beweg=#8
      jsr player.nachoben
      jsr player.nachlinks
      #end
      #if .byte beweg=#6
      jsr player.nachunten
      jsr player.nachlinks
      #end
      rts

nachoben  
      ldy ystore    
      ldx xstore
      jsr restore
      mva display1 displayzw
      #if .byte displayzw=#160
      mva #80 display1
      mva #160 display2
      dec  display2+1
      mva #0 display3
      #end
      #if .byte displayzw=#80
      mva #0 display1
      mva #80 display2
      mva #160 display3
      dec display3+1
      #end
      #if .byte displayzw=#0
      mva #160 display1
      dec display1+1
      mva #0 display2
      mva #80 display3
      #end
      ldy ystore
      jsr store
      ldy ystore    
      ldx xstore
      jsr print
      jsr store
      rts
nachunten 
      ldy ystore  
      ldx xstore
      jsr restore
      mva display3 displayzw
      #if .byte displayzw=#160
      mva #0 display3
      inc display3+1
      mva #80 display1
      mva #160 display2
      #end
      #if .byte displayzw=#0
      mva #80 display3
      mva #0 display2
      inc display2+1
      mva #160 display1
      #end
      #if .byte displayzw=#80
      mva #160 display3
      mva #80 display2
      mva #0 display1
      inc display1+1
      #end
      ldy ystore
      ldy ystore
      ldx xstore
      jsr print
      jsr store
      rts
nachrechts  
      ldy ystore
      ldx xstore
      inx
      inx
      inx
      stx xstore
      #if .byte xstore=#12
      ldx #0 
      stx xstore
      jsr restore
      mva tmp2 tmp1
      mva tmp3 tmp2
      mva tmp5 tmp4
      mva tmp6 tmp5
      mva tmp8 tmp7
      mva tmp9 tmp8
      inc ystore
      ldy ystore
      iny
      iny
      lda (display1),y
      sta tmp3
      clc
      ldy ystore
      iny
      iny
      lda (display2),y
      sta tmp6
      clc
      ldy ystore
      iny
      iny
      lda (display3),y
      sta tmp9
      ldy ystore
      #end
      jsr print
      jsr store
      #if .byte ystore=#45
      dey
      #end
      rts
nachlinks
      ldy ystore
      ldx xstore
      dex
      dex
      dex
      stx xstore
      #if .byte xstore=#253
      ldx #9
      stx xstore
      jsr restore
      mva tmp2 tmp3
      mva tmp1 tmp2
      mva tmp5 tmp6
      mva tmp4 tmp5
      mva tmp8 tmp9
      mva tmp7 tmp8
      dec ystore
      ldy ystore
      lda (display1),y
      sta tmp1
      clc
      ldy ystore
      lda (display2),y
      sta tmp4
      clc
      ldy ystore
      lda (display3),y
      sta tmp7
      ldy ystore
      #end  
      jsr print
      jsr store
      #if .byte ystore=#1
      iny
      #end
      rts   
print               ;Player printen + Fusion Bildschirm
      lda tmp1
      and maske11,x
      eor player11,x
      sta (display1),y
      inx
      iny
      lda tmp2
      and maske11,x
      eor player11,x
      sta (display1),y
      inx
      iny
      lda tmp3
      and maske11,x
      eor player11,x
      sta (display1),y
      ldx xstore
      clc
      ldy ystore
      lda tmp4
      and maske12,x
      eor player12,x
      sta (display2),y
      inx
      iny
      lda tmp5
      and maske12,x
      eor player12,x
      sta (display2),y
      inx
      iny
      lda tmp6
      and maske12,x
      eor player12,x
      sta (display2),y
      ldx xstore
      clc
      ldy ystore
      lda tmp7
      and maske13,x
      eor player13,x
      sta (display3),y
      inx
      iny
      lda tmp8
      and maske13,x
      eor player13,x
      sta (display3),y
      inx
      iny
      lda tmp9
      and maske13,x
      eor player13,x
      sta (display3),y

      rts
store         ;Bildschirm in tmp sichern

      sec
      lda display1+1
      sbc #36
      sta display199+1
      sec
      lda display2+1
      sbc #36
      sta display299+1
      sec
      lda display3+1
      sbc #36
      sta display399+1
      mva display1 display199
      mva display2 display299
      mva display3 display399
      lda (display199),y      
      sta tmp1
      iny
      lda (display199),y    
      sta tmp2
      iny
      lda (display199),y      
      sta tmp3
      clc
      ldy ystore

      lda (display299),y      
      sta tmp4
      iny
      lda (display299),y    
      sta tmp5
      iny
      lda (display299),y      
      sta tmp6
      clc
      ldy ystore

      lda (display399),y      
      sta tmp7
      iny
      lda (display399),y    
      sta tmp8
      iny
      lda (display399),y      
      sta tmp9
      rts
restore             ;tmp in Bildschirm printen (restore)
      lda tmp1
      sta (display1),y
      iny
      lda tmp2
      sta (display1),y      
      iny 
      lda tmp3
      sta (display1),y
      clc
      ldy ystore

      lda tmp4
      sta (display2),y
      iny
      lda tmp5
      sta (display2),y      
      iny 
      lda tmp6
      sta (display2),y
      clc
      ldy ystore

      lda tmp7
      sta (display3),y
      iny
      lda tmp8
      sta (display3),y      
      iny 
      lda tmp9
      sta (display3),y

      rts
      .endp



      run main

wie gesagt, läuft unter MADS, läßt sich aber leicht in die anderen Versionen konvertieren. Ich nutze gerne die #if ... #end Anweisung, wo das nicht geht, der muss das umschreiben! Alle Parts werde ich einzeln erklären...

Gruß Peter

AntwortZitat

Part 1 - die Displaylist:

    org 4096


dlist .by 117,117,117
    .by 93,210,155
    .by 93,0,156    
    .by 93,80,156
    .by 93,160,156

    .by 93,0,157
    .by 93,80,157
    .by 221,160,157

    .by 93,0,158
    .by 93,80,158
    .by 93,160,158  

    .by 93,0,159
    .by 93,80,159
    .by 93,160,159  

    .by 93,0,160    
    .by 93,80,160
    .by 93,160,160

    .by 93,0,161
    .by 93,80,161
    .by 221,160,161

    .by 93,0,162
    .by 93,80,162
    .by 93,160,162

    .by 93,0,163
    .by 93,80,163
    .by 93,160,163

    .by 93,0,164    
    .by 93,80,164
    .by 93,160,164

    .by 93,0,165
    .by 93,80,165
    .by 93,160,165

    .by 93,0,166
    .by 93,80,166
    .by 93,160,166  

    .by 93,0,167
    .by 93,80,167
    .by 93,160,167

    .by 93,0,168  
    .by 93,80,168
    .by 93,160,168

    .by 93,0,169
    .by 93,80,169
    .by 93,160,169

    .by 93,0,170
    .by 93,80,170
    .by 93,160,170

    .by 93,0,171
    .by 93,80,171
    .by 93,160,171

    .by 93,0,172
    .by 93,80,172
    .by 93,160,172

    .by 93,0,173
    .by 93,80,173
    .by 93,160,173

    .by 93,0,174
    .by 93,80,174
    .by 93,160,174

    .by 93,0,175
    .by 93,80,175
    .by 93,160,175

    .by 93,0,176  
    .by 93,80,176
    .by 93,160,176

    .by 93,0,177
    .by 93,80,177
    .by 93,160,177

    .by 93,0,178
    .by 93,80,178
    .by 93,160,178

    .by 93,0,179
    .by 93,80,179
    .by 93,160,179

    .by 93,0,180  
    .by 93,80,180
    .by 93,160,180

    .by 93,0,181
    .by 93,80,181
    .by 93,160,181

    .by 93,0,182
    .by 93,80,182
    .by 93,160,182

    .by 93,0,183
    .by 93,80,183
    .by 93,160,183

    .by 93,0,184
    .by 93,80,184
    .by 93,160,184

    .by 93,0,185
    .by 93,80,185
    .by 93,160,185

    .by 93,0,186
    .by 93,80,186
    .by 93,160,186

    .by 93,0,187
    .by 93,80,187
    .by 221,160,187
    .by 65
    .wo dlist

org 4096 legt fest, wo das Programm startet. Nämlich bei $1000 bzw. 4096

Es folgt die Definition der Displaylist (DL) - dlist ist letztlich die Definition, an welche Speicherstelle die DL steht. Dorthin wird dann SDLSTL und SDLSTH hingebogen - hier sucht der Rechner den Vektor für die DL. 117 in der DL bedeutet 3 schwarze Blöcke am oberen Bildschirmrand. Für das Scrolling habe ich diese DL so aufgebaut. Jede Bildschirmzeile bekommt eine eigene Adresse mit Sprungbefehl. Der Befehl ist 93 und setzt sich aus 64+13+16 = 93 zusammen. 64 ist der eigentliche Sprungbefehl, 13 bedeutet Antic D Modus und 16 bedeutet horizontales Scrolling. Drei Zeilen haben noch +128 (93+128=221) - hier ist ein DL-Interrupt Einsprung vorgesehen. Für dieses Beispiel brauchen wir allerdings keinen Interrupt und kein Feinscrolling - aus der 93 / 221 könnte man auch ein 77 machen. Die DL habe ich schon für das Parallax vorbereitet...

Der eigentliche Bildschirm startet bei 0, 156 - also 0 + 256x156 = 39936 (die Zeile 93,210,155 - Adresse 39890 vergessen wir mal - die brauche ich auch fürs Parallax). Am Ende der DL kommt noch der Befehl 65 und .wo dlist - das bedeutet spring zurück zum Anfang der DL und wiederhole sie.

Das wars schon mit der DL für Antic D. Man kann das natürlich anders definieren, ich habe es aber so gewählt, weil ich damit auch für den Grobscroll eine doppelte Zeilenbreite bereitstelle. Wenn ich bei den Playern immer drei kleine Sprites gleichzeitig behandle, dann muss ich für den Zeilenwechsel wenig Aufwand treiben und nichts berechnen oder mit Masken arbeiten, die DL ist quasi meine Maske - dazu aber später. Ein kompletter Zeilenwechsel erreicht man im besten Fall einfach durch Increment oder Decrement des Highbyte.

Gruß Peter

AntwortZitat

$1000 ist meist zu tief, um das Programm später am Atari laden zu können. DOS liegt oft noch dort im Speicher. Zur Sicherheit geht für die originalen ATARI DOS eine Startadresse ab $1f00 oder gleich bei $2000. Natürlich gibt es GameDOS (z.B. MyPicoDOS) oder spezielle kurze DOS (z.B. uDOS oder auch xBOOT), die auch mit $1000 problemlos klarkommen.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

AntwortZitat

... ja das stimmt und ist jetzt ja auch nur ein Demoprogramm, wo man das Dos nicht braucht. Battle of Eris übrigens fängt auch bei $1000 an (da brauchte ich jeden Speicher, den ich bekommen konnte) und hat dennoch die Highscore-Option mit einem sehr schmalen Dos 😉

AntwortZitat
      org $2000
      icl 'dlist.asm'

display = $e4
display99 = $e6
          ;------ Speicher und Variablen für Player allgemein ----------
display1 = $e8
display2 = $ea
display3 = $ec
display199 = $ee
display299 = $f0
display399 = $f2
tmp1 = $600 
tmp2 = $601
tmp3 = $602
tmp4 = $603
tmp5 = $604
tmp6 = $605
tmp7 = $606
tmp8 = $607
tmp9 = $608
displayzw = $609
ystore = $60a
xstore = $60b
beweg = $60c
        ;------ Variablen für die Warteschleifen -----------------------
delay = $60d
schleife1 = $60e
schleife2 = $60f
        ;------ Variablen für Player1 ----------------------------------
zaehler1 = $610
display11 = $611
display21 = $613
display31 = $615
tmp11 = $617  
tmp21 = $618
tmp31 = $619
tmp41 = $61a
tmp51 = $61b
tmp61 = $61c
tmp71 = $61d
tmp81 = $61e
tmp91 = $61f
displayzw1 = $620
ystore1 = $621
xstore1 = $622

        ;------ Variablen für Player2 ----------------------------------

zaehler2 = $630
display12 = $631
display22 = $633
display32 = $635
tmp12 = $637  
tmp22 = $638
tmp32 = $639
tmp42 = $63a
tmp52 = $63b
tmp62 = $63c
tmp72 = $63d
tmp82 = $63e
tmp92 = $63f
displayzw2 = $640
ystore2 = $641
xstore2 = $642
        ;------ Variablen für Player3 ----------------------------------

zaehler3 = $650
display13 = $651
display23 = $653
display33 = $655
tmp13 = $657    
tmp23 = $658
tmp33 = $659
tmp43 = $65a
tmp53 = $65b
tmp63 = $65c
tmp73 = $65d
tmp83 = $65e
tmp93 = $65f
displayzw3 = $660
ystore3 = $661
xstore3 = $662
        ;---------------------------------------------------------------

player11  .by 170,170,0
      .by 42,170,128
      .by 10,170,160
      .by 2,170,168
player12  .by 85,85,0
      .by 21,85,64
      .by 5,85,80
      .by 1,85,84
player13  .by 170,170,0
      .by 42,170,128
      .by 10,170,160
      .by 2,170,168     
maske11   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3
maske12   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3
maske13   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3

bewegung1 .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2 .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3   
bewegung3 .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5   

Ich habe jetzt die Variablen etwas angepasst und in die unkritische Page 6 gesetzt, außerdem startet das Programm bei $2000 Alles andere geht zwar auch, da kann es aber zu Konfikten mit dem DOS kommen.

In dem Programm definiere ich zunächst die Display-Variablen: In display steht die Anfangsbildschirmadresse ($9c00) und in display99 kommt die Bildschirmkopie rein ($7800). Ich brauche also 2 komplette Bildschirme... ein sichtbarer und eine Kopie (unsichtbar).

Es wird eine zentrale Routine geben, die den jeweiligen Player printet - da jeder Player im Prinzip aus 3 kleinen Player zusammengesetzt ist, brauche ich hierfür nochmal die Variablen display1,2,3 (sichtbarer Bereich) und display199,299,399 Kopie unsichtbarer Bereich. Diese Variablen müssen in Page 0 liegen wegen der notwendigen indirekt indizierten Adressierung.

Da die zentrale Playerprintroutine alle Player versorgt, müssen notwendige Variablen definiert werden (tmp1-9, ystore, xstore,beweg und displayzw) - jeder Player hat dann entsprechende Variablen, die den gesamten Zustand des Players beinhalten und jeweils in die Playerhauptroutine übertragen und am Ende wieder rückübertragen werden.

Als nächstes folgen die Definition des Players selber - also wie er aussieht:

Player 11 12 13 definiert einen (!) Player. Alle drei Player in diesem Beispiel greifen also auf die gleiche Maske zu und sehen entsprechend auch gleich aus. Da wir hier drei kleinste Einheiten haben, brauche ich drei Playerdefinitionen jeweils für einen großen Player. player11 definiert also eine Kleinsteinheit (eigentlich sogar 2 nebeneinander). 170,170,0 bedeutet 2 Balken nebeneinander und ein leeres Feld rechts davon. Ich beschreibe also beim printen des Players drei 4 Bit Felder auf dem Bildschirm nebeneinander (Antic D - 4Bit). Darunter das Gleiche nochmal, aber um ein Bit nach rechts verschoben, dann nochmal ein Bit nach rechts und nochmal - wir simulieren hier letztlich ein Feinscroll nach rechts. Nach printen von player11,x (x=0) player11,x (x=1) player11,x (x=2) player11,x (x=3) wird der Player um eins nach rechts versetzt (quasi ein grobscroll) und dann kommt wieder player11,x (x=0) ... das macht die Bewegung nach rechts. Bewegung nach links ist im Prinzip ähnlich, man kommt aber von x=3 und printet bis x=0 Wozu die Masken? Die Masken brauchen wir letztlich, um die Player nicht nur auf den Bildschirm zu printen, sondern um den Player mit dem Bildschirm zu fusionieren. Die Masken sind quasi ein Spiegelbild der Player und bewirken bei einer AND-Verknüpfung mit dem originalen Bildschirminhalt das voher Löschen des Bildschirminhaltes genau da, wo Inhalte des Player hinkommen. Überall da, wo der Player keinen Inhalt hat (also eine Null) soll ja der Bildschirminhalt sichtbar sein und das mache ich halt mit der Maske. Der eigentliche Schritt ist einfach und immer gleich:

Bildschirminhalt AND MaskePlayer EOR Playerinhalt

Das werde ich später nochmal etwas genauer erklären!

in bewegung1,2,3 habe ich mal ganz einfache Bewegungsmuster definiert: 1 = Player nach oben, 3 nach rechts, 5 nach unten, 7 nach links und die ganzen Zwischenstufen 2,4,6,8 für die Schrägbewegungen.

So viel zunächst dazu. Danach erkläre ich das Hauptprogramm - also Aufbau des Testbildschirmes, Ablauf des Programmes und die Startwerte für die drei Player...

Ich hoffe alles ist einigermaßen verständlich, falls nicht, dann gerne nachfragen!

Gruß Peter

AntwortZitat

Ich finde das mit den Software Sprites von Dir voll cool.

Ich spiele gerade mit den Atari Hardware Player/Missiles rum. Genauer mit der MultiSprite Routine von Tebe/Shanti77. So langsam komme ich hinter das Geheimnis und habe den Source für mich schon stark angepasst.

Hier mal eine Demo: demo-15-sprites-multicolor.mp4

Das es nicht so stark flackert ist dem Altirra Emulator zu verdanken, wenn man in der Configuration unter Video das Frame blending aktiviert. Das entspricht wohl mehr den alten Röhrenmonitoren mit nachleuchtender Plasmaschicht die Älteren wissen was ich meine. 😀

Hier werden 15 Sprites angezeigt, mein nächstes Game braucht allerdings nur max 8-10 Sprites und das auch nur in Single-Color. Werde den Code also für die Single-Sprites noch überarbeiten. Damit es nicht flackert, wenn ich 4 Sprites in einer Zeile zeige. Zudem sind einige Objekte höher als 16 Bytes.

BTW: Der Source-Code von Tebe/Shanti77 ist fürchterlich, sehr viel SMC (Self-Modified-Code), Bedingte Sprünge mit Bxx *+n wird viel verwendet, was in die Hose geht, wenn die zu überspringenden Bytes sich ändern von z.B. 2Byte auf 1Byte (Zero-Page). Da werden Tabellen an Adressen+128 gesucht. Statt 2 Tabellen mit low und high Byte zu verwenden. Dann das polnisch in den Kommentaren/Variablen Namen. Gut das es mittlerweile translate.google.de gibt. Allerdings sind da auch ein paar coole Sachen drin, ein Optimizer der Sprite-Routinen erstellt und die 32 Bytes in weniger als 200 Zyklen in den Player/Missile Grafik kopiert. Schon krass. Mein schnellstes Move braucht dazu ~450Zyklen. Dafür ist es kleiner. Ich schreibe mir den Code jedenfalls so um, das es einfacher ist ihn wieder zu verwenden.

BTW: Das Demo selbst funktioniert so wie es gerade ist nicht mehr sauber auf NTSC Maschinen, weil der Atari einfach nicht schnell genug ist.

LG Lars

Anhänge:
AntwortZitat

Hallo Lars, vielen Dank für deinen Beitrag. Ich hatte im Netz auch schon einige Beispiele gesehen, wo bis zu 60 Player über den Bildschirm huschen. Ich glaube da wird ganz viel mit DLI gearbeitet. Das Problem erschien mir immer dabei ein Flackern und schwieriges Handling wenn die Player frei überall hinfliegen - dann aauch mit starkem Flackern. Wenn man eine moderate Anzahl von Playern nimmt, kann man das vielleicht viel stabiler hinbekommen - jedenfalls ist die Technik sehr interessant und ich bin höchst interessiert an deiner Analyse. Vielleicht kannst du es "uns" ja hier im Forum auch mir ein paar guten Erklärungen nahebringen - wenn du das möchtest... also ich bin immer sehr interessiert an neuen Techniken. Es ist schon toll, was man aus dieser alten Kiste rausquetschen kann... Gruß Peter

AntwortZitat

jetzt habe ich doch tatsächlich nach der langen Zeit noch einen relativ elementaren Fehler in der Routine gefunden, anbei jetzt der richtige Code:

      org 4096


dlist .by 117,117,117
    .by 93,210,155
    .by 93,0,156    
    .by 93,80,156
    .by 93,160,156

    .by 93,0,157
    .by 93,80,157
    .by 221,160,157

    .by 93,0,158
    .by 93,80,158
    .by 93,160,158  

    .by 93,0,159
    .by 93,80,159
    .by 93,160,159  

    .by 93,0,160    
    .by 93,80,160
    .by 93,160,160

    .by 93,0,161
    .by 93,80,161
    .by 221,160,161

    .by 93,0,162
    .by 93,80,162
    .by 93,160,162

    .by 93,0,163
    .by 93,80,163
    .by 93,160,163

    .by 93,0,164    
    .by 93,80,164
    .by 93,160,164

    .by 93,0,165
    .by 93,80,165
    .by 93,160,165

    .by 93,0,166
    .by 93,80,166
    .by 93,160,166  

    .by 93,0,167
    .by 93,80,167
    .by 93,160,167

    .by 93,0,168  
    .by 93,80,168
    .by 93,160,168

    .by 93,0,169
    .by 93,80,169
    .by 93,160,169

    .by 93,0,170
    .by 93,80,170
    .by 93,160,170

    .by 93,0,171
    .by 93,80,171
    .by 93,160,171

    .by 93,0,172
    .by 93,80,172
    .by 93,160,172

    .by 93,0,173
    .by 93,80,173
    .by 93,160,173

    .by 93,0,174
    .by 93,80,174
    .by 93,160,174

    .by 93,0,175
    .by 93,80,175
    .by 93,160,175

    .by 93,0,176  
    .by 93,80,176
    .by 93,160,176

    .by 93,0,177
    .by 93,80,177
    .by 93,160,177

    .by 93,0,178
    .by 93,80,178
    .by 93,160,178

    .by 93,0,179
    .by 93,80,179
    .by 93,160,179

    .by 93,0,180  
    .by 93,80,180
    .by 93,160,180

    .by 93,0,181
    .by 93,80,181
    .by 93,160,181

    .by 93,0,182
    .by 93,80,182
    .by 93,160,182

    .by 93,0,183
    .by 93,80,183
    .by 93,160,183

    .by 93,0,184
    .by 93,80,184
    .by 93,160,184

    .by 93,0,185
    .by 93,80,185
    .by 93,160,185

    .by 93,0,186
    .by 93,80,186
    .by 93,160,186

    .by 93,0,187
    .by 93,80,187
    .by 221,160,187
    .by 65
    .wo dlist


display = 228
display99 = 230
          ;------ Speicher und Variablen für Player allgemein ----------
display1 = 232
display2 = 234
display3 = 236
display199 = 238
display299 = 240
display399 = 242
tmp1 = 1000   
tmp2 = 1001
tmp3 = 1002
tmp4 = 1003
tmp5 = 1004
tmp6 = 1005
tmp7 = 1006
tmp8 = 1007
tmp9 = 1008
displayzw = 1009
ystore = 1011
xstore = 1012
beweg = 1013

randomp .by 00

        ;------ Variablen für die Warteschleifen -----------------------
delay = 1020
schleife1 = 1021
schleife2 = 1022
        ;------ Variablen für Player1 ----------------------------------
zaehler1 = 1100
display11 = 1102
display21 = 1104
display31 = 1106
tmp11 = 1108    
tmp21 = 1109
tmp31 = 1110
tmp41 = 1111
tmp51 = 1112
tmp61 = 1113
tmp71 = 1114
tmp81 = 1115
tmp91 = 1116
displayzw1 = 1117
ystore1 = 1118
xstore1 = 1119

        ;------ Variablen für Player2 ----------------------------------

zaehler2 = 1120
display12 = 1122
display22 = 1124
display32 = 1126
tmp12 = 1128    
tmp22 = 1129
tmp32 = 1130
tmp42 = 1131
tmp52 = 1132
tmp62 = 1133
tmp72 = 1134
tmp82 = 1135
tmp92 = 1136
displayzw2 = 1137
ystore2 = 1138
xstore2 = 1139
        ;------ Variablen für Player3 ----------------------------------

zaehler3 = 1140
display13 = 1142
display23 = 1144
display33 = 1146
tmp13 = 1148    
tmp23 = 1149
tmp33 = 1150
tmp43 = 1151
tmp53 = 1152
tmp63 = 1153
tmp73 = 1154
tmp83 = 1155
tmp93 = 1156
displayzw3 = 1157
ystore3 = 1158
xstore3 = 1159
        ;---------------------------------------------------------------

player11  .by 170,170,0
      .by 42,170,128
      .by 10,170,160
      .by 2,170,168
player12  .by 85,85,0
      .by 21,85,64
      .by 5,85,80
      .by 1,85,84
player13  .by 170,170,0
      .by 42,170,128
      .by 10,170,160
      .by 2,170,168     
maske11   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3
maske12   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3
maske13   .by 0,0,255
      .by 192,0,63
      .by 240,0,15
      .by 252,0,3

bewegung1 .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2 .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3   
bewegung3 .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5   

      .proc main
      mwa #39936 display    ;--- hier fängt die Bildschirmadresse an 0,156 = 256x156
      mwa #30720 display99
      mwa #dlist 560  
      ldx #0          ;Bildschirm füllen
      ldy #0
@     inc randomp
      lda randomp
      sta tmp1
      #if .byte tmp1>#40
      ;jmp @-
      #end
      sta (display),y
      sta (display99),y
      iny
      bne @-
      inc display+1
      inc display99+1
      clc
      inx
      cpx #31
      bne @-
      ;-------------------- Variablen Player1 init ---------      
      mva #0 display11
      mva #80 display21
      mva #160 display31
      lda #170
      sta display11+1
      sta display21+1
      sta display31+1
      mva #0 zaehler1
      ldy #34
      sty ystore1
      ;-------------------- Variablen Player2 init ---------      
      mva #0 display12
      mva #80 display22
      mva #160 display32
      lda #173
      sta display12+1
      sta display22+1
      sta display32+1
      mva #0 zaehler2
      ldy #44
      sty ystore2
      ;-------------------- Variablen Player3 init ---------      
      mva #0 display13
      mva #80 display23
      mva #160 display33
      lda #165
      sta display13+1
      sta display23+1
      sta display33+1
      mva #0 zaehler3
      ldy #44
      sty ystore3

;--------------------------Hauptprogramm----------------------------
loop    
      jsr player1
      jsr player2
      jsr player3
      mva #4 delay
      jsr warte2
      jmp loop    
      .endp
;--------------------------Subroutinen------------------------------

        .proc warte2
        mva #0 schleife1
        mva #0 schleife2
@     inc schleife1
      #if .byte schleife1<#255
      jmp @-
      #end
      mva #0 schleife1
      inc schleife2
      #if .byte schleife2<delay
      jmp @-
      #end
      rts
      .endp
        .proc player1
        mwa display11 display1
      mwa display21 display2
      mwa display31 display3
      mva tmp11 tmp1
      mva tmp21 tmp2
      mva tmp31 tmp3
      mva tmp41 tmp4
      mva tmp51 tmp5
      mva tmp61 tmp6
      mva tmp71 tmp7
      mva tmp81 tmp8
      mva tmp91 tmp9
      mva displayzw1 displayzw
      mva ystore1 ystore
      mva xstore1 xstore
        ldx zaehler1
      lda bewegung1,x
      sta beweg
      jsr player.bewegung
      inc zaehler1
      #if .byte zaehler1=#79    
      mva #0 zaehler1
      #end
      mwa display1 display11 
      mwa display2 display21 
      mwa display3 display31 
      mva tmp1 tmp11
      mva tmp2 tmp21
      mva tmp3 tmp31
      mva tmp4 tmp41
      mva tmp5 tmp51
      mva tmp6 tmp61
      mva tmp7 tmp71
      mva tmp8 tmp81
      mva tmp9 tmp91
      mva displayzw displayzw1
      mva ystore ystore1
      mva xstore xstore1
      #if .byte ystore1<=#0
      jsr player.restore
        mva #0 display11
      mva #80 display21
      mva #160 display31
      lda #170
      sta display11+1
      sta display21+1
      sta display31+1
      mva #0 zaehler1
      ldy #34
      sty ystore1
        #end
      rts
      .endp
      .proc player2
        mwa display12 display1
      mwa display22 display2
      mwa display32 display3
      mva tmp12 tmp1
      mva tmp22 tmp2
      mva tmp32 tmp3
      mva tmp42 tmp4
      mva tmp52 tmp5
      mva tmp62 tmp6
      mva tmp72 tmp7
      mva tmp82 tmp8
      mva tmp92 tmp9
      mva displayzw2 displayzw
      mva ystore2 ystore
      mva xstore2 xstore
        ldx zaehler2
      lda bewegung3,x
      sta beweg
      jsr player.bewegung
      inc zaehler2
      #if .byte zaehler2=#79    
      mva #0 zaehler2
      #end
      mwa display1 display12
      mwa display2 display22 
      mwa display3 display32 
      mva tmp1 tmp12
      mva tmp2 tmp22
      mva tmp3 tmp32
      mva tmp4 tmp42
      mva tmp5 tmp52
      mva tmp6 tmp62
      mva tmp7 tmp72
      mva tmp8 tmp82
      mva tmp9 tmp92
      mva displayzw displayzw2
      mva ystore ystore2
      mva xstore xstore2
      #if .byte ystore2<=#0
      jsr player.restore
        mva #0 display12
      mva #80 display22
      mva #160 display32
      lda #173
      sta display12+1
      sta display22+1
      sta display32+1
      mva #0 zaehler2
      ldy #44
      sty ystore2
        #end
      rts
      .endp
      .proc player3
        mwa display13 display1
      mwa display23 display2
      mwa display33 display3
      mva tmp13 tmp1
      mva tmp23 tmp2
      mva tmp33 tmp3
      mva tmp43 tmp4
      mva tmp53 tmp5
      mva tmp63 tmp6
      mva tmp73 tmp7
      mva tmp83 tmp8
      mva tmp93 tmp9
      mva displayzw3 displayzw
      mva ystore3 ystore
      mva xstore3 xstore
        ldx zaehler3
      lda bewegung2,x
      sta beweg
      jsr player.bewegung
      inc zaehler3
      #if .byte zaehler3=#79    
      mva #0 zaehler3
      #end
      mwa display1 display13
      mwa display2 display23 
      mwa display3 display33 
      mva tmp1 tmp13
      mva tmp2 tmp23
      mva tmp3 tmp33
      mva tmp4 tmp43
      mva tmp5 tmp53
      mva tmp6 tmp63
      mva tmp7 tmp73
      mva tmp8 tmp83
      mva tmp9 tmp93
      mva displayzw displayzw3
      mva ystore ystore3
      mva xstore xstore3
      #if .byte ystore3<=#0
      jsr player.restore
        mva #0 display13
      mva #80 display23
      mva #160 display33
      lda #165
      sta display13+1
      sta display23+1
      sta display33+1
      mva #0 zaehler3
      ldy #44
      sty ystore3
        #end
      rts
      .endp
      .proc player
bewegung  #if .byte beweg=#7
      jsr player.nachlinks
      #end
      #if .byte beweg=#3
      jsr player.nachrechts
      #end
      #if .byte beweg=#5
      jsr player.nachunten
      #end
      #if .byte beweg=#1
      jsr player.nachoben
      #end
      #if .byte beweg=#2
      jsr player.nachoben
      jsr player.nachrechts
      #end
      #if .byte beweg=#4
      jsr player.nachunten
      jsr player.nachrechts
      #end
      #if .byte beweg=#8
      jsr player.nachoben
      jsr player.nachlinks
      #end
      #if .byte beweg=#6
      jsr player.nachunten
      jsr player.nachlinks
      #end
      rts

nachoben  
      ldy ystore    
      ldx xstore
      jsr restore
      mva display1 displayzw
      #if .byte displayzw=#160
      mva #80 display1
      mva #160 display2
      dec  display2+1
      mva #0 display3
      #end
      #if .byte displayzw=#80
      mva #0 display1
      mva #80 display2
      mva #160 display3
      dec display3+1
      #end
      #if .byte displayzw=#0
      mva #160 display1
      dec display1+1
      mva #0 display2
      mva #80 display3
      #end
      ldy ystore
      jsr store
      ldy ystore    
      ldx xstore
      jsr print
      jsr store
      rts
nachunten 
      ldy ystore  
      ldx xstore
      jsr restore
      mva display3 displayzw
      #if .byte displayzw=#160
      mva #0 display3
      inc display3+1
      mva #80 display1
      mva #160 display2
      #end
      #if .byte displayzw=#0
      mva #80 display3
      mva #0 display2
      inc display2+1
      mva #160 display1
      #end
      #if .byte displayzw=#80
      mva #160 display3
      mva #80 display2
      mva #0 display1
      inc display1+1
      #end
      ldy ystore
      ldy ystore
      ldx xstore
      jsr print
      jsr store
      rts
nachrechts  
      ldy ystore
      ldx xstore
      inx
      inx
      inx
      stx xstore
      #if .byte xstore=#12
      ldx #0 
      stx xstore
      jsr restore
      mva tmp2 tmp1
      mva tmp3 tmp2
      mva tmp5 tmp4
      mva tmp6 tmp5
      mva tmp8 tmp7
      mva tmp9 tmp8
      inc ystore
      ldy ystore
      iny
      iny
      lda (display1),y
      sta tmp3
      clc
      ldy ystore
      iny
      iny
      lda (display2),y
      sta tmp6
      clc
      ldy ystore
      iny
      iny
      lda (display3),y
      sta tmp9
      ldy ystore
      #end
      jsr print
      jsr store
      #if .byte ystore=#45
      dey
      #end
      rts
nachlinks
      ldy ystore
      ldx xstore
      dex
      dex
      dex
      stx xstore
      #if .byte xstore=#253
      ldx #9
      stx xstore
      jsr restore
      mva tmp2 tmp3
      mva tmp1 tmp2
      mva tmp5 tmp6
      mva tmp4 tmp5
      mva tmp8 tmp9
      mva tmp7 tmp8
      dec ystore
      ldy ystore
      lda (display1),y
      sta tmp1
      clc
      ldy ystore
      lda (display2),y
      sta tmp4
      clc
      ldy ystore
      lda (display3),y
      sta tmp7
      ldy ystore
      #end  
      jsr print
      jsr store
      #if .byte ystore=#1
      iny
      #end
      rts   
print               ;Player printen + Fusion Bildschirm
      lda tmp1
      and maske11,x
      eor player11,x
      sta (display1),y
      inx
      iny
      lda tmp2
      and maske11,x
      eor player11,x
      sta (display1),y
      inx
      iny
      lda tmp3
      and maske11,x
      eor player11,x
      sta (display1),y
      ldx xstore
      clc
      ldy ystore
      lda tmp4
      and maske12,x
      eor player12,x
      sta (display2),y
      inx
      iny
      lda tmp5
      and maske12,x
      eor player12,x
      sta (display2),y
      inx
      iny
      lda tmp6
      and maske12,x
      eor player12,x
      sta (display2),y
      ldx xstore
      clc
      ldy ystore
      lda tmp7
      and maske13,x
      eor player13,x
      sta (display3),y
      inx
      iny
      lda tmp8
      and maske13,x
      eor player13,x
      sta (display3),y
      inx
      iny
      lda tmp9
      and maske13,x
      eor player13,x
      sta (display3),y

      rts
store         ;Bildschirm in tmp sichern

      sec
      lda display1+1
      sbc #36
      sta display199+1
      sec
      lda display2+1
      sbc #36
      sta display299+1
      sec
      lda display3+1
      sbc #36
      sta display399+1
      mva display1 display199
      mva display2 display299
      mva display3 display399

      ldy ystore

      lda (display199),y      
      sta tmp1
      iny
      lda (display199),y    
      sta tmp2
      iny
      lda (display199),y      
      sta tmp3
      clc
      ldy ystore

      lda (display299),y      
      sta tmp4
      iny
      lda (display299),y    
      sta tmp5
      iny
      lda (display299),y      
      sta tmp6
      clc
      ldy ystore

      lda (display399),y      
      sta tmp7
      iny
      lda (display399),y    
      sta tmp8
      iny
      lda (display399),y      
      sta tmp9
      rts
restore             ;tmp in Bildschirm printen (restore)
      lda tmp1
      sta (display1),y
      iny
      lda tmp2
      sta (display1),y      
      iny 
      lda tmp3
      sta (display1),y
      clc
      ldy ystore

      lda tmp4
      sta (display2),y
      iny
      lda tmp5
      sta (display2),y      
      iny 
      lda tmp6
      sta (display2),y
      clc
      ldy ystore

      lda tmp7
      sta (display3),y
      iny
      lda tmp8
      sta (display3),y      
      iny 
      lda tmp9
      sta (display3),y

      rts
      .endp



      run main
AntwortZitat